﻿var ns = namespace("kaskelot.web");

ns.validation = function () {

	jQuery.validator.addMethod(
		"postnummer",
		function (value, element) {
			var pattern = /^[0-9]{3}[ ][0-9]{2}$/;
			if (!pattern.test(value))
				return false;

			return true;
		},
		"Ange ett giltigt postnummer (ex. 123 45)"
	);

	jQuery.validator.addMethod(
		"personnummer",
		function (value, element) {
			// Testa formatet
			var pattern = /^(19|20)[0-9]{6}[-+][0-9]{4}$/;
			if (!pattern.test(value))
				return false;

			// Testa att det inte är nonsens som t ex månad 15
			var month = parseInt(value.substring(4, 6), '10');
			if (month < 1 || month > 12)
				return false;

			var day = parseInt(value.substring(6, 8), '10');
			if (day < 1 ||
				day > 31 ||
				(month == 2 && day > 29) ||
				(month == 4 && day > 30) ||
				(month == 6 && day > 30) ||
				(month == 9 && day > 30) ||
				(month == 11 && day > 30))
				return false;

			// Testa att det har en korrekt kontrollsiffra
			var siffror = value.substring(2, 8).concat(value.substring(9, 12));

			var summa = 0;
			for (var i = 0; i < 9; i++) {
				var num = parseInt(siffror.substring(i, i + 1), '10');

				var ny = 0;
				if (i % 2 == 0) {
					ny = num * 2;
				} else {
					ny = num;
				}

				if (ny > 9) {
					summa += 1;
					summa += (ny - 10);
				} else {
					summa += ny;
				}
			}

			while (summa > 10) {
				summa -= 10;
			}

			var entalssiffra = summa;
			var kontrollsiffra = 10 - entalssiffra;

			if (parseInt(value.substring(12), '10') != kontrollsiffra)
				return false;

			return true;
		},
		"Ange ett giltigt personnummer enligt formatet ÅÅÅÅMMDD-XXXX");

	jQuery.validator.addMethod(
		"epost",
		function (value, element) {
			var pattern = /^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}$/;
			return pattern.test(value);
		},
		"Ange en giltig epostadress");

	jQuery.validator.addMethod(
		"emailRepeat",
		function (value, element) {
			return $(".epost").val().toLowerCase() === value.toLowerCase();
		},
		"Epostadresserna matchar inte");

	jQuery.extend(jQuery.validator.messages, {
		required: "Fältet är obligatoriskt",
		email: "Ogiltig epostadress"
	});

	function init() {
		valid("#RunwayMasterForm", function () { });
	}

	function valid(selector, action) {
		$(selector).validate({
			ignore: ":disabled, .ignore, :hidden:not(select)",
			//onkeyup: function (element) { $(element).valid(); },
			//onfocusout: function (element) { $(element).valid(); },
			//onclick: function (element) { $(element).valid(); },
			submitHandler: function () {
				action();
			},
			errorPlacement: function (error, element) {
				if (element.attr("type") === "radio" || element.attr("type") === "checkbox") {
					error.insertAfter(element.parent().find("legend"));
				}
				else {
					error.insertBefore(element);
				}
			},
			highlight: function (element, errorClass, validClass) {
				$(element).closest('div').addClass(errorClass).removeClass(validClass);
			},
			unhighlight: function (element, errorClass, validClass) {
				$(element).closest('div').removeClass(errorClass).addClass(validClass);
			},
			invalidHandler: function (e, validator) {
				var errors = validator.numberOfInvalids();
				if (errors) {
					var message = errors == 1
					    ? "Ett fält är ogiltigt"
					    : errors + " fält är ogiltiga"
					$("div.errorSummary span").html(message);
					$("div.errorSummary").show();
				}
				else {
					$("div.errorSummary").hide();
				}
			}
		});
	}

	return {
		init: init,
		valid: valid
	}
}();